<?php
    namespace Core\ORM;
    /**
     * Translate un objet PHP en une table de BDD
     *
     * @author mpetrini
     */
    class Table {
        /**
        * @var string $nomClasse
        */
        protected $nomClasse;
        /**
        * @var string $nom
        */
        protected $nom;
        /**
        * @var string $alias
        */
        protected $alias;
        /**
        * @var \Core\ORM\Table $parent
        */
        protected $parent;
        /**
        * @var \Core\ORM\Attributs\Attribut[] $champs 
        */
        protected $champs;
        
        /**
        * Constructeur
        * 
        * @param string $classe
        * 
        * @return void
        */
        public function __construct($classe) {
            $this->setNomClasse($classe);
            $this->setNom($classe::getTable());
            $this->champs=$classe::getAttributs();
            $this->champs[]= \Core\ORM\Attributs\Attribut::getDefautId();
            $this->setAlias($this->nom);
            $this->parent = null;
        }
        /**
        * Permet de récupérer toutes les tables liées à celle-ci
        *
        * @return \Core\ORM\Table[]
        */
        public function getTablesLiees() {
            $tabRetour = array();
            foreach($this->champs as $champ) {
                if($champ instanceof \Core\ORM\Attributs\Objet) {
                    $tabRetour[] = new Table($champ->getNomClasse());
                }
            }
            return $tabRetour;
        }
        /**
        * Récupère l'alias complet dans une reqûete
        * 
        * @return string
        */
        public function getAliasComplet() {
            $retour = $this->alias;
            $temp = $this->parent;
            while($temp instanceof Table) {
                if($temp->getParent() instanceof Table) {
                    $retour .=  "_".$temp->getAlias();
                }
                $temp = $temp->getParent();
            }
            return $retour;
        }
        /**
        * Permet la génération de la reqûete SQL 
        * 
        * @return string
        */
        public function creationRequeteSelect() {
            $compteur = 0;
            $sql =  '';
            foreach($this->getChamps() as $attribut) {
                if($compteur > 0) {
                    $sql .= ',';
                }
                $sql .= $this->getAlias().'.'.$attribut->getNom().' as '.$this->getAlias().'_'.$attribut->getNom();
                $compteur++;
            }
            return $sql;
        }
        
        /**
        * Permet de récupérer un objet Attribut de cette Table grâce à son nom
        * 
        * @param string $nomAttribut
        * 
        * @return \Core\ORM\Attributs\Attribut
        */
        public function getAttributParNom($nomAttribut) {
            if($nomAttribut === 'id') {
                return Attributs\Attribut::getDefautId();
            }
            foreach($this->champs as $attribut) {
                if  (($attribut->getNom() === $nomAttribut) || 
                    ($attribut instanceof \Core\ORM\Attributs\Objet && strtolower($attribut->getNomClasse()) === $nomAttribut)) {
                        return $attribut;
                }
            }
            return null;
        }
        //GETTERS ET SETTERS
        public function getNomClasse() {return $this->nomClasse;}
        public function setNomClasse($nomClasse) {$this->nomClasse=$nomClasse;}
        public function getNom() {return $this->nom;}
        public function setNom($nom) {$this->nom=$nom;}
        public function getAlias() {return $this->alias;}
        public function setAlias($alias) {$this->alias=$alias;}
        public function getParent() {return $this->parent;}
        public function setParent($parent) {
            $this->parent=$parent;
            $this->setAlias($this->parent->getAlias().'_'.$this->nom);
        }
        public function getChamps() {return $this->champs;}
    }
?>
